/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.collections.list;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
/**
* JUnit tests.
*
* @since Commons Collections 3.0
* @version $Revision: 646780 $ $Date: 2008-04-10 13:48:07 +0100 (Thu, 10 Apr 2008) $
*
* @author Matthew Hawthorne
* @author Tom Dunham
*/
public class TestSetUniqueList extends AbstractTestList {
public static void main(String[] args) {
TestRunner.run(suite());
}
public static Test suite() {
return new TestSuite(TestSetUniqueList.class);
}
public TestSetUniqueList(String testName) {
super(testName);
}
//-----------------------------------------------------------------------
public List makeEmptyList() {
return new SetUniqueList(new ArrayList(), new HashSet());
}
public void testListIteratorSet() {
// override to block
resetFull();
ListIterator it = getList().listIterator();
it.next();
try {
it.set(null);
fail();
} catch (UnsupportedOperationException ex) {}
}
public Object[] getFullNonNullElements() {
// override to avoid duplicate "One"
return new Object[] {
new String(""),
new String("One"),
new Integer(2),
"Three",
new Integer(4),
new Double(5),
new Float(6),
"Seven",
"Eight",
new String("Nine"),
new Integer(10),
new Short((short)11),
new Long(12),
"Thirteen",
"14",
"15",
new Byte((byte)16)
};
}
public void testListIteratorAdd() {
// override to cope with Set behaviour
resetEmpty();
List list1 = getList();
List list2 = getConfirmedList();
Object[] elements = getOtherElements(); // changed here
ListIterator iter1 = list1.listIterator();
ListIterator iter2 = list2.listIterator();
for (int i = 0; i < elements.length; i++) {
iter1.add(elements[i]);
iter2.add(elements[i]);
super.verify(); // changed here
}
resetFull();
iter1 = getList().listIterator();
iter2 = getConfirmedList().listIterator();
for (int i = 0; i < elements.length; i++) {
iter1.next();
iter2.next();
iter1.add(elements[i]);
iter2.add(elements[i]);
super.verify(); // changed here
}
}
public void testCollectionAddAll() {
// override for set behaviour
resetEmpty();
Object[] elements = getFullElements();
boolean r = collection.addAll(Arrays.asList(elements));
confirmed.addAll(Arrays.asList(elements));
verify();
assertTrue("Empty collection should change after addAll", r);
for (int i = 0; i < elements.length; i++) {
assertTrue("Collection should contain added element",
collection.contains(elements[i]));
}
resetFull();
int size = collection.size();
elements = getOtherElements();
r = collection.addAll(Arrays.asList(elements));
confirmed.addAll(Arrays.asList(elements));
verify();
assertTrue("Full collection should change after addAll", r);
for (int i = 0; i < elements.length; i++) {
assertTrue("Full collection should contain added element " + i,
collection.contains(elements[i]));
}
assertEquals("Size should increase after addAll",
size + elements.length, collection.size());
}
public void testListSetByIndex() {
// override for set behaviour
resetFull();
int size = collection.size();
getList().set(0, new Long(1000));
assertEquals(size, collection.size());
getList().set(2, new Long(1000));
assertEquals(size - 1, collection.size());
assertEquals(new Long(1000), getList().get(1)); // set into 2, but shifted down to 1
}
boolean extraVerify = true;
public void testCollectionIteratorRemove() {
try {
extraVerify = false;
super.testCollectionIteratorRemove();
} finally {
extraVerify = true;
}
}
public void verify() {
super.verify();
if (extraVerify) {
int size = collection.size();
getList().add(new Long(1000));
assertEquals(size + 1, collection.size());
getList().add(new Long(1000));
assertEquals(size + 1, collection.size());
assertEquals(new Long(1000), getList().get(size));
getList().remove(size);
}
}
//-----------------------------------------------------------------------
public void testFactory() {
Integer[] array = new Integer[] {new Integer(1), new Integer(2), new Integer(1)};
ArrayList list = new ArrayList(Arrays.asList(array));
final SetUniqueList lset = SetUniqueList.decorate(list);
assertEquals("Duplicate element was added.", 2, lset.size());
assertEquals(new Integer(1), lset.get(0));
assertEquals(new Integer(2), lset.get(1));
assertEquals(new Integer(1), list.get(0));
assertEquals(new Integer(2), list.get(1));
}
public void testAdd() {
final SetUniqueList lset = new SetUniqueList(new ArrayList(), new HashSet());
// Duplicate element
final Object obj = new Integer(1);
lset.add(obj);
lset.add(obj);
assertEquals("Duplicate element was added.", 1, lset.size());
// Unique element
lset.add(new Integer(2));
assertEquals("Unique element was not added.", 2, lset.size());
}
public void testAddAll() {
final SetUniqueList lset = new SetUniqueList(new ArrayList(), new HashSet());
lset.addAll(
Arrays.asList(new Integer[] { new Integer(1), new Integer(1)}));
assertEquals("Duplicate element was added.", 1, lset.size());
}
public void testSet() {
final SetUniqueList lset = new SetUniqueList(new ArrayList(), new HashSet());
// Duplicate element
final Object obj1 = new Integer(1);
final Object obj2 = new Integer(2);
final Object obj3 = new Integer(3);
lset.add(obj1);
lset.add(obj2);
lset.set(0, obj1);
assertEquals(2, lset.size());
assertSame(obj1, lset.get(0));
assertSame(obj2, lset.get(1));
lset.clear();
lset.add(obj1);
lset.add(obj2);
lset.set(0, obj2);
assertEquals(1, lset.size());
assertSame(obj2, lset.get(0));
lset.clear();
lset.add(obj1);
lset.add(obj2);
lset.set(0, obj3);
assertEquals(2, lset.size());
assertSame(obj3, lset.get(0));
assertSame(obj2, lset.get(1));
lset.clear();
lset.add(obj1);
lset.add(obj2);
lset.set(1, obj1);
assertEquals(1, lset.size());
assertSame(obj1, lset.get(0));
}
public void testListIterator() {
final SetUniqueList lset = new SetUniqueList(new ArrayList(), new HashSet());
final Object obj1 = new Integer(1);
final Object obj2 = new Integer(2);
lset.add(obj1);
lset.add(obj2);
// Attempts to add a duplicate object
for (final ListIterator it = lset.listIterator(); it.hasNext();) {
it.next();
if (!it.hasNext()) {
it.add(obj1);
break;
}
}
assertEquals("Duplicate element was added", 2, lset.size());
}
public void testUniqueListReInsert() {
List l = SetUniqueList.decorate(new LinkedList());
l.add(new Object());
l.add(new Object());
Object a = l.get(0);
// duplicate is removed
l.set(0, l.get(1));
assertEquals(1, l.size());
// old object is added back in
l.add(1, a);
assertEquals(2, l.size());
}
public void testUniqueListDoubleInsert() {
List l = SetUniqueList.decorate(new LinkedList());
l.add(new Object());
l.add(new Object());
// duplicate is removed
l.set(0, l.get(1));
assertEquals(1, l.size());
// duplicate should be removed again
l.add(1, l.get(0));
assertEquals(1, l.size());
}
public void testSetDownwardsInList() {
/*
* Checks the following semantics
* [a,b]
* set(0,b): [b]->a
* So UniqList contains [b] and a is returned
*/
ArrayList l = new ArrayList();
HashSet s = new HashSet();
final SetUniqueList ul = new SetUniqueList(l, s);
Object a = new Object();
Object b = new Object();
ul.add(a);
ul.add(b);
assertEquals(a, l.get(0));
assertEquals(b, l.get(1));
assertTrue(s.contains(a));
assertTrue(s.contains(b));
assertEquals(a, ul.set(0, b));
assertEquals(1, s.size());
assertEquals(1, l.size());
assertEquals(b, l.get(0));
assertTrue(s.contains(b));
assertFalse(s.contains(a));
}
public void testSetInBiggerList() {
/*
* Checks the following semantics
* [a,b,c]
* set(0,b): [b,c]->a
* So UniqList contains [b,c] and a is returned
*/
ArrayList l = new ArrayList();
HashSet s = new HashSet();
final SetUniqueList ul = new SetUniqueList(l, s);
Object a = new Object();
Object b = new Object();
Object c = new Object();
ul.add(a);
ul.add(b);
ul.add(c);
assertEquals(a, l.get(0));
assertEquals(b, l.get(1));
assertEquals(c, l.get(2));
assertTrue(s.contains(a));
assertTrue(s.contains(b));
assertTrue(s.contains(c));
assertEquals(a, ul.set(0, b));
assertEquals(2, s.size());
assertEquals(2, l.size());
assertEquals(b, l.get(0));
assertEquals(c, l.get(1));
assertFalse(s.contains(a));
assertTrue(s.contains(b));
assertTrue(s.contains(c));
}
public void testSetUpwardsInList() {
/*
* Checks the following semantics
* [a,b,c]
* set(1,a): [a,c]->b
* So UniqList contains [a,c] and b is returned
*/
ArrayList l = new ArrayList();
HashSet s = new HashSet();
final SetUniqueList ul = new SetUniqueList(l, s);
Object a = new String("A");
Object b = new String("B");
Object c = new String("C");
ul.add(a);
ul.add(b);
ul.add(c);
assertEquals(a, l.get(0));
assertEquals(b, l.get(1));
assertEquals(c, l.get(2));
assertTrue(s.contains(a));
assertTrue(s.contains(b));
assertTrue(s.contains(c));
assertEquals(b, ul.set(1, a));
assertEquals(2, s.size());
assertEquals(2, l.size());
assertEquals(a, l.get(0));
assertEquals(c, l.get(1));
assertTrue(s.contains(a));
assertFalse(s.contains(b));
assertTrue(s.contains(c));
}
//-----------------------------------------------------------------------
public String getCompatibilityVersion() {
return "3.1";
}
// public void testCreate() throws Exception {
// resetEmpty();
// writeExternalFormToDisk((java.io.Serializable) collection, "D:/dev/collections/data/test/SetUniqueList.emptyCollection.version3.1.obj");
// resetFull();
// writeExternalFormToDisk((java.io.Serializable) collection, "D:/dev/collections/data/test/SetUniqueList.fullCollection.version3.1.obj");
// }
}